package de.htw.ejb.model;

import de.htw.ejb.model.Bestellposition;
import de.htw.ejb.model.Kunde;
import de.htw.ejb.model.listener.BestellungMonitor;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Diese Klasse implementiert die datentechnische Darstellung einer Bestellung
 * 
 * @author Thomas Schoenfeld
 * @version 20130313-01
 */
// Kann man nicht auf Bestellung verzichten und alles in Bestellposition
// auslagern bzw. umgekehrt?
@EntityListeners( BestellungMonitor.class )
@Entity
@NamedQueries( { @NamedQuery( name = "selectBestellungById", query = "SELECT b FROM Bestellung b WHERE b.id = :id" ) } )
public class Bestellung implements Serializable
{
	
	public static final String					SELECT_BY_ID			= "selectBestellungById";
	
	public static final String					ID								= "id";
	
	private static final long						serialVersionUID	= 1L;
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	@Column( name = "id" )
	private int													bestellnummer;
	@ManyToOne
	private Kunde												kunde;
	@Temporal( TemporalType.DATE )
	private Date												bestelldatum;
	@Temporal( TemporalType.DATE )
	private Date												lieferdatum;
	@OneToMany( mappedBy = "kopf", cascade = { CascadeType.ALL } )
	private Collection<Bestellposition>	positionen;
	
	public int getBestellnummer()
	{
		return bestellnummer;
	}
	
	public void setBestellnummer( int bestellnummer )
	{
		this.bestellnummer = bestellnummer;
	}
	
	public Kunde getKunde()
	{
		return kunde;
	}
	
	public void setKunde( Kunde kunde )
	{
		this.kunde = kunde;
	}
	
	public Date getBestelldatum()
	{
		return bestelldatum;
	}
	
	public void setBestelldatum( Date bestelldatum )
	{
		this.bestelldatum = bestelldatum;
	}
	
	public Date getLieferdatum()
	{
		return lieferdatum;
	}
	
	public void setLieferdatum( Date lieferdatum )
	{
		this.lieferdatum = lieferdatum;
	}
	
	public Collection<Bestellposition> getPositionen()
	{
		return positionen;
	}
	
	public void setPositionen( Collection<Bestellposition> positionen )
	{
		this.positionen = positionen;
	}
	
	public void hinzufuegenBestellposition( Bestellposition position )
	{
		this.positionen.add( position );
	}
	
	public void loeschenBestellposition( Bestellposition position )
	{
		this.positionen.remove( position );
	}
	
	@Override
	public String toString()
	{
		return "Bestellung [bestellnummer=" + bestellnummer + ", kunde=" + kunde
				+ ", bestelldatum=" + bestelldatum + ", lieferdatum=" + lieferdatum
				+ ", positionen=" + positionen + "]";
	}
}
